package com.locatme.modelBD;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import com.google.android.gms.maps.model.LatLng;
import com.locatme.model.Enseigne;
import com.locatme.model.Langue;
import com.locatme.model.Personne;
import com.locatme.model.Utilisateur;

import java.util.ArrayList;
import java.util.List;


public class UtilisateurBD extends GestionBD {
    Context context;

    public UtilisateurBD(Context context) {
        //On cre la BDD
        super(context);
        this.context = context;
    }

    /**
     * insertPersonne : Methode qui insert une nouvelle personne dans la BDD
     *
     * @param user : Personne
     * @return long : -1 si la requte ne s'est pas bien droule
     */
    public long insertPersonne(Personne user) {
        //Cration d'un ContentValues
        ContentValues values = new ContentValues();
        //on lui ajoute une valeur associée à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
        values.put(BdLocatme.COL_LOGIN_PERSONNE, user.getLogin());
        values.put(BdLocatme.COL_PWD_PERSONNE, user.getPwd());
        values.put(BdLocatme.COL_PSEUDO, user.getPseudo());
        //on insère l'objet dans la BDD via le ContentValues
        return db.insert(BdLocatme.TABLE_PERSONNE, null, values);
    }

    /**
     * insertEnseigne: Methode qui insert une nouvelle enseigne dans la BDD
     *
     * @param user : Enseigne
     * @return long : -1 si la requte ne s'est pas bien droule
     */
    public long insertEnseigne(Enseigne user) {
        ContentValues values = new ContentValues();
        //on lui ajoute une valeur associée à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
        values.put(BdLocatme.COL_LOGIN_ENSEIGNE, user.getLogin());
        values.put(BdLocatme.COL_PWD_Enseigne, user.getPwd());
        values.put(BdLocatme.COL_NOM_ENSEIGNE, user.getNomEnseigne());
        values.put(BdLocatme.COL_DESC_ENSEIGNE, user.getDescEnseigne());
        values.put(BdLocatme.COL_H_OUVERTURE, user.getHeureOuverture());
        values.put(BdLocatme.COL_H_FERMETURE, user.getHeureFermeture());
        //on insère l'objet dans la BDD via le ContentValues
        return db.insert(BdLocatme.TABLE_ENSEIGNE, null, values);
    }

    /**
     * verifPersonne : methode qui vrifie le couple login/mdp pour une personne
     *
     * @param login : String
     * @param pwd   : String
     * @return Personne
     */
    public Personne verifPersonne(String login, String pwd) {
        //Requete
        Cursor c = db.rawQuery("SELECT " + BdLocatme.COL_LOGIN_PERSONNE + "," + BdLocatme.COL_PWD_PERSONNE + " FROM " +
                BdLocatme.TABLE_PERSONNE + " WHERE " + BdLocatme.COL_LOGIN_PERSONNE + "= ? AND " + BdLocatme.COL_PWD_PERSONNE + "= ?", new String[]{login, pwd});

        return CursorToPersonne(c);
    }

    /**
     * getPersonneByLogin : methode qui rcupre une personne en fonction du login en parametre
     *
     * @param login : String
     * @return Personne
     */
    public Personne getPersonneByLogin(String login) {
        //Requete
        Cursor c = db.rawQuery("SELECT " + BdLocatme.COL_LOGIN_PERSONNE + "," + BdLocatme.COL_PWD_PERSONNE + " FROM " +
                BdLocatme.TABLE_PERSONNE + " WHERE " + BdLocatme.COL_LOGIN_PERSONNE + "= ?", new String[]{login});

        return CursorToPersonne(c);
    }

    /**
     * CursorToPersonne : Methode qui construit la personne en fonction des donne du cursor
     *
     * @param c : Cursor
     * @return Personne
     */
    public Personne CursorToPersonne(Cursor c) {
        //Si le curseur n'est pas nul
        if (c.getCount() == 0) {
            c.close();
            return null;
        }

        c.moveToFirst();
        //Creation de la personne et affectation donnes
        Personne user = new Personne();
        user.setLogin(c.getString(0));
        user.setPwd(c.getString(1));

        c.close();

        return user;
    }

    /**
     * VerifEnseigne : methode qui vrifie le couple login/mdp pour une enseigne
     *
     * @param login : String
     * @param pwd   : String
     * @return Enseigne
     */
    public Enseigne VerifEnseigne(String login, String pwd) {

        //Requete
        Cursor c = db.rawQuery("SELECT " + BdLocatme.COL_LOGIN_ENSEIGNE + "," + BdLocatme.COL_PWD_Enseigne + "," +
                BdLocatme.COL_NOM_ENSEIGNE + "," + BdLocatme.COL_DESC_ENSEIGNE + "," + BdLocatme.COL_H_OUVERTURE + "," +
                BdLocatme.COL_H_FERMETURE + "," + BdLocatme.COL_ID_LOC_E + " " +
                "FROM " + BdLocatme.TABLE_ENSEIGNE + " " +
                "WHERE " + BdLocatme.COL_LOGIN_ENSEIGNE + "= ? AND " + BdLocatme.COL_PWD_Enseigne + "= ?", new String[]{login, pwd});

        return CursorToEnseigne(c);
    }

    /**
     * CursorToEnseigne : methode construit un objet enseigne en fonction des donnes du cursor
     *
     * @param c : Cursor
     * @return Enseigne
     */
    public Enseigne CursorToEnseigne(Cursor c) {
        //Si le curseur est nul
        if (c.getCount() == 0) {
            c.close();
            return null;
        }

        c.moveToFirst();
        //Cration de l'enseigne et affectation des donnes
        Enseigne user = new Enseigne();
        user.setLogin(c.getString(0));
        user.setPwd(c.getString(1));
        user.setNomEnseigne(c.getString(2));
        user.setDescEnseigne(c.getString(3));
        user.setHeureOuverture(c.getString(4));
        user.setHeureFermeture(c.getString(5));
        c.close();

        return user;
    }


    /**
     * Methode qui rcupre tous les utilisateurs en fonction du type pass en paramtre
     *
     * @param type : int, 1 = personne 2 = enseigne
     * @return ArrayList d'utilisateur
     */
    public ArrayList<Utilisateur> getUserByType(int type) {
        Cursor c = null;

        //Si type=1 (personne)
        if (type == 1) {
            //Requete de rcupration des donnes
            c = db.rawQuery("SELECT " +
                    BdLocatme.TABLE_PERSONNE + "." + BdLocatme.COL_LOGIN_PERSONNE + ", " +
                    BdLocatme.TABLE_PERSONNE + "." + BdLocatme.COL_PWD_PERSONNE + ", " +
                    BdLocatme.TABLE_PERSONNE + "." + BdLocatme.COL_PSEUDO + "," +
                    BdLocatme.TABLE_LOCALISATION + "." + BdLocatme.COL_LATITUDE + ", " +
                    BdLocatme.TABLE_LOCALISATION + "." + BdLocatme.COL_LONGITUDE +
                    " FROM " +
                    BdLocatme.TABLE_PERSONNE + " , " + BdLocatme.TABLE_LOCALISATION + ", " + BdLocatme.TABLE_LANGUE + ", " + BdLocatme.TABLE_LANGUE_PERSONNE +
                    " WHERE " + BdLocatme.TABLE_PERSONNE + "." + BdLocatme.COL_ID_LOC_P + "= " + BdLocatme.TABLE_LOCALISATION + "." + BdLocatme.COL_ID_LOC, null);

            //Si type=2 (enseigne)
        } else if (type == 2) {
            //Requete de rcupration des donnes
            c = db.rawQuery("SELECT " +
                    BdLocatme.TABLE_ENSEIGNE + "." + BdLocatme.COL_LOGIN_ENSEIGNE + ", " +
                    BdLocatme.TABLE_ENSEIGNE + "." + BdLocatme.COL_PWD_Enseigne + ", " +
                    BdLocatme.TABLE_ENSEIGNE + "." + BdLocatme.COL_NOM_ENSEIGNE + ", " +
                    BdLocatme.TABLE_LOCALISATION + "." + BdLocatme.COL_LATITUDE + ", " +
                    BdLocatme.TABLE_LOCALISATION + "." + BdLocatme.COL_LONGITUDE + ", " +
                    BdLocatme.COL_DESC_ENSEIGNE + "  FROM " +
                    BdLocatme.TABLE_ENSEIGNE + " , " + BdLocatme.TABLE_LOCALISATION + ", " + BdLocatme.TABLE_LANGUE + ", " + BdLocatme.TABLE_LANGUE_ENSEIGNE +
                    " WHERE " + BdLocatme.TABLE_ENSEIGNE + "." + BdLocatme.COL_ID_LOC_E + "= " + BdLocatme.TABLE_LOCALISATION + "." + BdLocatme.COL_ID_LOC, null);
        }

        return CursorToUsers(c, type);
    }

    /**
     * Methode qui parcours le curseur donn en paramtre et rempli une array list d'utilisateur en fonction d'un type donn.
     *
     * @param c    : Cursor
     * @param type : int, 1 = personne 2 = enseigne
     * @return ArrayList d'utilisateur
     */

    public ArrayList<Utilisateur> CursorToUsers(Cursor c, int type) {
        //Si le curseur est nul
        if (c.getCount() == 0) {
            c.close();
            return null;
        }
        //Cration variables  affecter et listes  remplir
        ArrayList<Utilisateur> users = new ArrayList<Utilisateur>();
        Utilisateur user = null;
        List<Langue> langues;
        String login;
        String pwd;
        String nomPublic;
        String descr;
        LatLng loca;
        LangueBD langueBD = new LangueBD(context);


        c.moveToFirst();
        //Parcours du curseur et cration des objets en fonction du type
        while (!c.isAfterLast()) {
            if (type == 1) {
                login = c.getString(0);
                pwd = c.getString(1);
                nomPublic = c.getString(2);
                langueBD.open();
                langues = langueBD.getLanguageByPersonne(login);
                loca = new LatLng(c.getDouble(3), c.getDouble(4));
                user = new Personne(login, pwd, langues, loca, nomPublic);
            } else if (type == 2) {
                login = c.getString(0);
                pwd = c.getString(1);
                nomPublic = c.getString(2);
                loca = new LatLng(c.getDouble(3), c.getDouble(4));
                descr = c.getString(5);
                langueBD.open();
                langues = langueBD.getLanguageByEnseigne(login);
                user = new Enseigne(login, pwd, langues, loca, nomPublic, descr);
            }
            users.add(user);
            c.moveToNext();
        }
        c.close();
        return users;
    }
}
